home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / falcon / utils / magi.lzh / MAGI.S < prev    next >
Text File  |  1993-05-10  |  10KB  |  496 lines

  1. ; MAGI, Par AGOPIAN Mathias
  2. ; pour STMAG.
  3. ; Le Falcon est une merveille...
  4. ; La preuve :
  5.  
  6. ;english comments & translation by Gunstick
  7.  
  8. superviseur    MACRO
  9.         clr.l    -(sp)
  10.         move.w    #$20,-(sp)
  11.         trap    #1
  12.         addq.l    #6,sp
  13.         move.l    d0,oldsp
  14.         ENDM
  15.         
  16. utilisateur    MACRO
  17.         move.l    oldsp,-(sp)
  18.         move.w    #$20,-(sp)
  19.         trap    #1
  20.         addq.l    #6,sp
  21.         ENDM
  22.     
  23.     lea    finconfig,a2
  24.     lea    config,a0
  25.     lea    $300000,a1
  26. bcl    move.b    (a0)+,(a1)+
  27.     cmp.l    a0,a2
  28.     bhi    bcl
  29.     superviseur
  30.     move.l    $4f2,a0
  31.     jmp    (a0)
  32.     utilisateur
  33.  
  34. oldsp    dc.l    0
  35.  
  36. config    dc.l    'MAGI'
  37.     dc.l    0
  38.     dc.l    0
  39.     lea    text1(pc),a0
  40.     bsr    print
  41.  
  42.     ; On met l'arbre de la PMMU hors de danger.
  43.     ;save MMU tree
  44.     lea    my_pmmu(pc),a0
  45.     lea    $310700,a1
  46.     move.l    a1,d7
  47.     move.w    #$100-1,d0
  48. .copy    move.b    (a0)+,(a1)+
  49.     dbf    d0,.copy
  50.     
  51.     lea    pmmureg(pc),a0
  52.     pmove.d    crp,(a0)
  53.     move.l    d7,4(a0)
  54.     pmove.d    (a0),crp
  55.  
  56.     ; Puis on initialise correctement la matrice DMA
  57.  
  58.     ; le HP interne ON (beuark)
  59. sound    move.w    #%10111111,-(sp)
  60.     move.w    #$1d,-(sp)
  61.     trap    #14
  62.     addq.l    #4,sp
  63.  
  64.     ;ADDER
  65.     move.w    #3,-(sp)    ; Matrice + ADC 
  66.     move.w    #4,-(sp)
  67.     move.w    #130,-(sp)
  68.     trap    #14
  69.     addq.l    #6,sp
  70.  
  71.     ; ADC INPUT
  72.     move.w    #3,-(sp)    ; PSG input 
  73.     move.w    #5,-(sp)
  74.     move.w    #130,-(sp)
  75.     trap    #14
  76.     addq.l    #6,sp
  77.  
  78.     ; Set prescale
  79.     move.w    #3,-(sp)    ; 50Khz 
  80.     move.w    #6,-(sp)
  81.     move.w    #130,-(sp)
  82.     trap    #14
  83.     addq.l    #6,sp
  84.  
  85.     ; Devconnect
  86.     move.w    #1,-(sp)    ; DMA -> DAC
  87.     move.w    #0,-(sp)
  88.     move.w    #0,-(sp)
  89.     move.w    #8,-(sp)
  90.     move.w    #0,-(sp)
  91.     move.w    #139,-(sp)
  92.     trap    #14
  93.     lea    12(sp),sp
  94.     
  95.     ; Setinterrupt
  96.     move.w    #1,-(sp)    ; Play
  97.     move.w    #0,-(sp)    ; Timer A
  98.     move.w    #135,-(sp)
  99.     trap    #14
  100.     addq.l    #6,sp
  101.     
  102.     ; Ici, c'est les initialisations
  103.  
  104.     move.w    #$3111,d7    ; Active le cache !
  105.     lea    q1(pc),a0
  106.     bsr    print
  107.     bsr    inkey
  108.     cmp.b    #'y',d0
  109.     beq.s    .q1o
  110.     or.w    #$0008,d7    ; Désactive le cache d'instruction    
  111. .q1o    lea    q2(pc),a0
  112.     bsr    print
  113.     bsr    inkey
  114.     cmp.b    #'y',d0
  115.     beq.s    .q2o
  116.     or.w    #$0800,d7    ; Désactive le cache de donnée    
  117. .q2o    movec    d7,CACR
  118.  
  119.     ; 16 Mhz, normal quoi
  120.     or.b    #$65,$ffff8007.w    
  121.     lea    q3(pc),a0
  122.     bsr    print
  123.     bsr    inkey
  124.     cmp.b    #'y',d0
  125.     beq.s    .q3o
  126.     bclr.b    #0,$ffff8007.w        ; 68030 à 8 Mhz
  127. .q3o    lea    q4(pc),a0
  128.     bsr    print
  129.     bsr    inkey
  130.     cmp.b    #'y',d0
  131.     beq.s    .q4o
  132.     bclr.b    #2,$ffff8007.w        ; Blitter à 8 Mhz
  133.  
  134. .q4o    lea    q5(pc),a0
  135.     bsr    print
  136.     bsr    inkey
  137.     cmp.b    #'y',d0
  138.     bne.s    .q5o
  139.     ; Emulation STE:
  140.     ; Regardez bien le bit 5, c'est une
  141.     ; merveille, grace à lui, on va
  142.     ; faire des miracles...
  143.     ;this disables a lot of BUS errors
  144.     bclr.b    #5,$ffff8007.w        ; Mode STE
  145.  
  146. .q5o    lea    q6(pc),a0
  147.     bsr    print
  148.     bsr    inkey
  149.     cmp.b    #'n',d0
  150.     beq    .q6o
  151.  
  152.     ; VECTEURS
  153.  
  154.     lea    $0,a0
  155.     lea    my_vectors(pc),a1
  156.     move.w    #1024-1,d0
  157. .copy    move.b    (a0)+,(a1)+
  158.     dbf    d0,.copy
  159.  
  160.     lea    my_vectors(pc),a1
  161.     lea    buserr(pc),a0
  162.     move.l    a0,$8(a1)
  163.     lea    adderr(pc),a0
  164.     move.l    a0,$c(a1)
  165.     lea    illegal(pc),a0
  166.     move.l    a0,$10(a1)
  167.     lea    div0(pc),a0
  168.     move.l    a0,$14(a1)
  169.     lea    chk(pc),a0
  170.     move.l    a0,$18(a1)
  171.     lea    trapv(pc),a0
  172.     move.l    a0,$1c(a1)
  173.     lea    trace(pc),a0
  174.     move.l    a0,$24(a1)
  175.     lea    my_la(pc),a0
  176.     move.l    a0,$28(a1)
  177.     lea    my_lf(pc),a0
  178.     move.l    a0,$2c(a1)
  179.     
  180.     lea    my_vbl(pc),a0
  181.     move.l    a0,$70(a1)
  182.     lea    my_hbl(pc),a0
  183.     move.l    a0,$68(a1)
  184.     lea    my_mfp(pc),a0
  185.     move.l    a0,$78(a1)
  186.     
  187.     lea    my_ta(pc),a0
  188.     move.l    a0,$134(a1)
  189.     lea    my_tb(pc),a0
  190.     move.l    a0,$120(a1)
  191.     lea    my_tc(pc),a0
  192.     move.l    a0,$114(a1)
  193.     lea    my_td(pc),a0
  194.     move.l    a0,$110(a1)
  195.     lea    my_mn(pc),a0
  196.     move.l    a0,$13c(a1)
  197.     lea    my_blt(pc),a0
  198.     move.l    a0,$10c(a1)
  199.     lea    my_dma(pc),a0
  200.     move.l    a0,$11c(a1)
  201.     lea    my_ikbd(pc),a0
  202.     move.l    a0,$118(a1)
  203.     
  204.     lea    $80(a1),a1
  205.     lea    my_tr0(pc),a0
  206.     move.l    a0,(a1)+
  207.     lea    my_tr1(pc),a0
  208.     move.l    a0,(a1)+
  209.     lea    my_tr2(pc),a0
  210.     move.l    a0,(a1)+
  211.     lea    my_tr3(pc),a0
  212.     move.l    a0,(a1)+
  213.     lea    my_tr4(pc),a0
  214.     move.l    a0,(a1)+
  215.     lea    my_tr5(pc),a0
  216.     move.l    a0,(a1)+
  217.     lea    my_tr6(pc),a0
  218.     move.l    a0,(a1)+
  219.     lea    my_tr7(pc),a0
  220.     move.l    a0,(a1)+
  221.     lea    my_tr8(pc),a0
  222.     move.l    a0,(a1)+
  223.     lea    my_tr9(pc),a0
  224.     move.l    a0,(a1)+
  225.     lea    my_tra(pc),a0
  226.     move.l    a0,(a1)+
  227.     lea    my_trb(pc),a0
  228.     move.l    a0,(a1)+
  229.     lea    my_trc(pc),a0
  230.     move.l    a0,(a1)+
  231.     lea    my_trd(pc),a0
  232.     move.l    a0,(a1)+
  233.     lea    my_tre(pc),a0
  234.     move.l    a0,(a1)+
  235.     lea    my_trf(pc),a0
  236.     move.l    a0,(a1)
  237.     lea    my_vectors(pc),a1
  238.     movec    a1,VBR
  239.     lea    basevec(pc),a0
  240.     move.l    a1,(a0)
  241.  
  242. .q6o    ; Set TIMER A or MFPi7
  243.     lea    q7(pc),a0
  244.     bsr    print
  245.     bsr    inkey
  246.     cmp.b    #'y',d0
  247.     beq.s    .q7o
  248.     ; Setinterrupt
  249.     move.w    #1,-(sp)    ; Play
  250.     move.w    #1,-(sp)    ; MFPi7
  251.     move.w    #135,-(sp)
  252.     trap    #14
  253.     addq.l    #6,sp
  254.  
  255. .q7o    lea    q8(pc),a0
  256.     bsr    print
  257.     bsr    inkey
  258.     cmp.b    #'n',d0
  259.     beq.s    .q8o
  260.     move.w    #%01000000,-(sp)    ; Coupe le HP interne
  261.     move.w    #$1e,-(sp)
  262.     trap    #14
  263.     addq.l    #4,sp
  264.  
  265. .q8o    ; On reboot
  266.     lea    text2(pc),a0
  267.     bsr    print
  268.     bsr    inkey
  269.     move.l    $4c6.w,a0
  270.     eor.w    #$FFFF,(a0)        ;detruit la checksum
  271.     move.w    #1,-(sp)
  272.     move.w    #0,-(sp)
  273.     move.w    #0,-(sp)
  274.     move.w    #1,-(sp)
  275.     move.w    #0,-(sp)
  276.     clr.l    -(sp)
  277.     move.l    $4c6,-(sp)
  278.     move.w    #8,-(sp)
  279.     trap    #14
  280.     lea    20(sp),sp
  281.     ; somme de controle
  282.     clr.l    d0
  283.     move.l    $4c6.w,a0
  284.     move.w    #255,d7
  285. check    add.w    (a0)+,d0
  286.     dbf    d7,check
  287.     cmp.w    #$1234,d0
  288.     bne.s    .fin
  289.     move.l    $4c6,a0
  290.     jsr    (a0)
  291.  
  292. .fin    lea    text3(pc),a0
  293.     bsr    print
  294.     bsr    inkey
  295.     rts            ;-> Bureau GEM
  296.  
  297.     ; Routines Annexes
  298.  
  299. print    move.l    a0,-(sp)
  300.     move.w    #9,-(sp)
  301.     trap    #1
  302.     addq.l    #6,sp
  303.     rts
  304.     
  305. inkey    move.w    #1,-(sp)
  306.     trap    #1
  307.     addq.l    #2,sp
  308.     rts
  309.  
  310.     ; Ca, c'est la ruse, on piège le FALCON !
  311.     ; Remarquez, vous pouvez metre ce que
  312.     ; vous voulez ici (héhé)
  313.     ;here is the new exception table.
  314.     ;insert your own routines if you wish
  315. illegal    jmp    ([$10])
  316. div0    jmp    ([$14])
  317. chk    jmp    ([$18])
  318. trapv    jmp    ([$1c])
  319. trace    jmp    ([$24])
  320. my_hbl    jmp    ([$68])
  321. my_vbl    jmp    ([$70])
  322. my_mfp    jmp    ([$78])
  323. my_ta    jmp    ([$134])
  324. my_tb    jmp    ([$120])
  325. my_tc    jmp    ([$114])
  326. my_td    jmp    ([$110])
  327. my_mn    jmp    ([$13c])
  328. my_dma    jmp    ([$11c])
  329. my_ikbd    jmp    ([$118])
  330. my_blt    jmp    ([$10c])
  331. my_la    jmp    ([$28])
  332. my_lf    jmp    ([$2c])
  333. my_tr0    jmp    ([$80])
  334. my_tr1    jmp    ([$84])
  335. my_tr2    jmp    ([$88])
  336. my_tr3    jmp    ([$8c])
  337. my_tr4    jmp    ([$90])
  338. my_tr5    jmp    ([$94])
  339. my_tr6    jmp    ([$98])
  340. my_tr7    jmp    ([$9c])
  341. my_tr8    jmp    ([$a0])
  342. my_tr9    jmp    ([$a4])
  343. my_tra    jmp    ([$a8])
  344. my_trb    jmp    ([$ac])
  345. my_trc    jmp    ([$b0])
  346. my_trd    jmp    ([$b4])
  347. my_tre    jmp    ([$b8])
  348. my_trf    jmp    ([$bc])
  349.  
  350.     ; Correction des erreurs bus et adresses
  351.     
  352.     ;only for experts... fucking around in the stackframe of
  353.     ;bus error to enable a somewhat correct sound on bad adresses
  354. buserr
  355. adderr    move.w    #$2700,sr
  356.     move.l    d0,$300004
  357.     move.l    a0,$300008
  358.     moveq    #0,d0
  359.     move.w    $a(sp),d0    
  360.     btst.l    #8,d0            ; DF=1 ?
  361.     beq    BorC            ; non
  362.  
  363.     ; Erreur sur un cycle de donnée    
  364.     btst.l    #6,d0            ; oui, RW=1 ?
  365.     beq.s    ecr            ; non, -> ecr
  366. lec    bclr.l    #8,d0            ; DF=0
  367.     move.w    d0,$a(sp)
  368.     cmp.w    #$ff88,$11(sp)        ; Erreur sur les reg. PSG?
  369.     bne.s    noPSGr            ; non
  370.     move.b    $ffff8800.w,d0
  371.     move.b    d0,$2c(sp)        ; et oui
  372.     move.b    d0,$2d(sp)        ; Réfléchissez un peu
  373.     move.b    d0,$2e(sp)
  374.     move.b    d0,$2f(sp)
  375.     bra    finexec
  376. noPSGr    clr.l    $2c(sp)            ; Temps pis, on renvoie zero !
  377.     move.w    #$00f,$ffff8240.w    ; Rouge
  378.     bra    finexec
  379.  
  380. ecr    bclr.l    #8,d0            ;DF=0
  381.     move.w    d0,$a(sp)        
  382.     cmp.w    #$ff88,$11(sp)
  383.     bne    notPSGw
  384.     and.w    #$ff02,$12(sp)        ; correction de l'adresse
  385.     tst.b    $13(sp)
  386.     bne.s    ff8802 
  387. ff8800    and.w    #$30,d0
  388.     lsr.w    #4,d0
  389.     tst.w    d0
  390.     beq.s    .s2
  391.     cmp.w    #1,d0
  392.     beq.s    .s1
  393.     cmp.w    #2,d0
  394.     beq.s    .s3
  395. .s1    move.b    $1b(sp),$ffff8800.w    ; Octet
  396.     bra    finexec    
  397. .s2    move.b    $1a(sp),$ffff8800.w    ; Mot
  398.     bra    finexec    
  399. .s3    move.b    $18(sp),$ffff8800.w
  400.     move.b    $1a(sp),$ffff8802.w    ; Long mot
  401.     bra    finexec    
  402.     
  403.     ;is there a volunteer to check also the movem instruction???
  404.  
  405. ff8802    and.w    #$30,d0
  406.     lsr.w    #4,d0
  407.     tst.w    d0
  408.     beq.s    .s2
  409.     cmp.w    #1,d0
  410.     beq.s    .s1
  411.     cmp.w    #2,d0
  412.     beq.s    .s3
  413. .s1    move.b    $1b(sp),$ffff8802.w
  414.     bra    finexec    
  415. .s2    move.b    $1a(sp),$ffff8802.w
  416.     bra    finexec    
  417. .s3    move.b    $18(sp),$ffff8802.w
  418.     move.b    $1a(sp),$ffff8800.w
  419.     bra    finexec    
  420. notPSGw    move.w    #$0f0,$ffff8240.w
  421.     bra    finexec        ; bah, on fait rien, y'a rien a faire !
  422.  
  423. BorC    btst.l    #14,d0
  424.     beq.s    etageB
  425.     btst.l    #15,d0
  426.     beq.s    etageC
  427.     bra    finexec        ; Ceci ne doit JAMAIS arriver
  428. etageB    move.w    #$f00,$ffff8240.w
  429.     bclr.l    #12,d0        ; RB=0
  430.     move.w    d0,$a(sp)        
  431.     cmp.w    #$a,6(sp)    ; format $A ?
  432.     bne.s    .fB
  433. .fA    move.w    2(sp),a0    ; simulons, simulons
  434.     move.w    a0,$e(sp)    ; bof, bof!
  435.     bra    fin